/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transervfx.Vista;

import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Pagination;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.util.Duration;
import transervfx.Dato.Entidad.Usuario;
import transervfx.Logica.GestorUsuario;
import transervfx.Vista.XML.pathRecusosFXML;
import utilidades.number.IntegerTextField;

/**
 * FXML Controller class
 *
 * @author oscar
 */
public class ABMUsuario extends VentanaModal {
    
  

    private Timeline locationUpdateTimeline;
    final static private int tiempoDeRespuesta=1000;
  
    @FXML
    private ImageView iconoBuscando;

    @FXML
    private TextField nombreUsuario;
    @FXML
    private TextField apellido;
    @FXML
    private TextField nombre;
    @FXML
    private ComboBox<String> tipoDoc;
    @FXML
    private IntegerTextField nroDoc;
    @FXML
    private TableView<Usuario> tablaUsuario;
    @FXML
    private TableColumn columNombreUsuario;
    @FXML
    private TableColumn columApellido;
    @FXML
    private TableColumn columNombre;
    @FXML
    private TableColumn columTipoDoc;
    @FXML
    private TableColumn columNorDoc;
    @FXML
    private TableColumn columTipo;
    @FXML
    private Pagination paginador;
    
    private int itemPorPagina = 10;
    
    final ObservableList<Usuario> dataSourceUsuario = FXCollections.observableArrayList();

    
     public ABMUsuario(Stage ventanaPadre,String titulo,int x, int y) {
        super( ventanaPadre, titulo, x,  y);
        initialize(null,null);
    }
    
    
    public void initialize(URL url, ResourceBundle rb) {
        
        tablaUsuario.setItems(dataSourceUsuario);

        //seteo parametros del paginador
        paginador.setMaxPageIndicatorCount(5);
        int nroDePaginas = ((numeroDePaginasPorFiltro().intValue() - 1)  / itemPorPagina) + 1;
        paginador.setPageCount(nroDePaginas);
        
        //cada vez que selecciona un indice del paginador crea la pagina
        paginador.setPageFactory(new Callback<Integer, Node>() {
            @Override
            public Node call(Integer pageIndex) {
                return crearPagina(pageIndex);
            }
        });
   

        //introduce un Escuchador para cada Field del Filtro
        //este escuchador va a llamar a su validador cada n tiempo
        //y escribe si el campo esta correcto o no
        this.nombreUsuario.textProperty().addListener(this.escuchadorInputTextField);
        this.apellido.textProperty().addListener(this.escuchadorInputTextField);
        this.nombre.textProperty().addListener(this.escuchadorInputTextField);
        this.nroDoc.textProperty().addListener(this.escuchadorInputTextField);
        this.tipoDoc.valueProperty().addListener(this.escuchadorInputTextField);


        //Hace un binding entre La columna y las propiedades del usuarioViedw
        columNombreUsuario.setCellValueFactory(
                new PropertyValueFactory<Usuario, String>("nombreUsuario"));
        columApellido.setCellValueFactory(
                new PropertyValueFactory<Usuario, String>("apellido"));
        columNombre.setCellValueFactory(
                new PropertyValueFactory<Usuario, String>("nombre"));
        columTipoDoc.setCellValueFactory(
                new PropertyValueFactory<Usuario, String>("tipoDoc"));
        columNorDoc.setCellValueFactory(
                new PropertyValueFactory<Usuario, Integer>("nroDoc"));
        columTipo.setCellValueFactory(
                new PropertyValueFactory<Usuario, String>("tipo"));
        
    //    System.out.println("texto "+this.nroDoc.getText()+"propertytext "+this.nroDoc.textProperty()+"propertynumber "+this.nroDoc.numberProperty()+" integer"+this.nroDoc.numberProperty().getValue());
    }

    

    public Node crearPagina(int pageIndex) {
        Integer nDoc = (this.nroDoc.textProperty().get().isEmpty()) ? null : this.nroDoc.getNumber();
        String tDoc = (this.tipoDoc.getSelectionModel().getSelectedItem() == null) ? "" : this.tipoDoc.getSelectionModel().getSelectedItem();


        VBox box = new VBox(1);

        this.dataSourceUsuario.clear();
        int page = pageIndex * itemPorPagina;
        this.dataSourceUsuario.addAll(GestorUsuario.getInstance().buscarPorFiltro(this.nombreUsuario.getText(), this.apellido.getText(), this.nombre.getText(), tDoc, nDoc, page, itemPorPagina));
        
        box.getChildren().add(this.tablaUsuario);

        return box;
    }
    
    
    

    private void buscarUsuarioPorFiltro(int ini, int nroElementos) {
     
        Integer nDoc = (this.nroDoc.textProperty().get().isEmpty()) ? null : this.nroDoc.getNumber();
        String tDoc = (this.tipoDoc.getSelectionModel().getSelectedItem() == null) ? "" : this.tipoDoc.getSelectionModel().getSelectedItem();


        List<Usuario> usuariosFiltrados = GestorUsuario.getInstance().buscarPorFiltro(this.nombreUsuario.getText(), this.apellido.getText(), this.nombre.getText(), tDoc, nDoc, ini, nroElementos);
        dataSourceUsuario.clear();
        this.dataSourceUsuario.addAll(usuariosFiltrados);
    }

    private Long numeroDePaginasPorFiltro() {
    
        Integer nDoc = (this.nroDoc.textProperty().get().isEmpty()) ? null : this.nroDoc.getNumber();       
        String tDoc = (this.tipoDoc.getSelectionModel().getSelectedItem() == null) ? "" : this.tipoDoc.getSelectionModel().getSelectedItem();

        return GestorUsuario.getInstance().numeroDeUsuariosFiltrados(this.nombreUsuario.getText(), this.apellido.getText(), this.nombre.getText(), tDoc, nDoc);

    }
    
    public void salirEvent(ActionEvent event) {
        //System.out.println(((Button)event.getSource()).getText());
        this.close();
        //System.exit(1);
    }

    public void crear() {
      new CrearUsuario(this,"Crear Usuario", 600, 320);
    }
    
    public void modificar() {
       if(!this.tablaUsuario.getSelectionModel().isEmpty()){
        Usuario u=this.tablaUsuario.getSelectionModel().getSelectedItem(); 
       
       new ModificarUsuario(u,this,"Crear Usuario", 600, 320); 
       }
       
    }
    
    ChangeListener escuchadorInputTextField = new ChangeListener<String>() {
        public void changed(
                ObservableValue<? extends String> observableValue,
                String s, String s1) {

            if (!s1.isEmpty() || !s.equals(s1)) {
                // delay location updates to we don't go too fast file typing

                iconoBuscando.setVisible(true);

                if (locationUpdateTimeline != null) {

                    locationUpdateTimeline.stop();
                }

                locationUpdateTimeline = new Timeline();
                locationUpdateTimeline.getKeyFrames().add(
                        new KeyFrame(new Duration(tiempoDeRespuesta),
                        new EventHandler<ActionEvent>() {
                            public void handle(ActionEvent actionEvent) {
                                System.out.println("locationUpdateTimeline " + locationUpdateTimeline.getDelay());

                                // items.removeAll(items);
                                int nroDePaginas = ((numeroDePaginasPorFiltro().intValue() - 1) / itemPorPagina) + 1;
                                paginador.setPageCount(nroDePaginas);
                                
                                buscarUsuarioPorFiltro(0, itemPorPagina);
                                iconoBuscando.setVisible(false);
                            }
                        }));
                locationUpdateTimeline.play();

            }
        }
    };

    @Override
    URL getURLFXML() {
          return pathRecusosFXML.class.getResource("ABMUsuarioFXML.fxml");
    }

    public void actualizarTabla() {
        int nroDePaginas = ((numeroDePaginasPorFiltro().intValue() - 1) / itemPorPagina) + 1;
        paginador.setPageCount(nroDePaginas);

        this.buscarUsuarioPorFiltro(0, itemPorPagina);
    }
    
     
}
